7.06. Справочник по Docker
Справочник по Docker
Docker — это платформа для создания, запуска и управления контейнеризированными приложениями. Контейнеры изолируют процессы и зависимости, обеспечивая единообразие выполнения в разных средах. Docker использует образы как шаблоны для запуска контейнеров, а также предоставляет инструменты для сетевого взаимодействия, хранения данных, сборки, развёртывания и оркестрации.
Основные понятия
Образ (Image)
Образ — неизменяемый шаблон файловой системы с метаданными, необходимыми для запуска контейнера. Состоит из слоёв, каждый из которых представляет собой изменения относительно предыдущего. Образы хранятся в реестрах (например, Docker Hub) или локально.
Контейнер (Container)
Контейнер — исполняемый экземпляр образа. Имеет собственное пространство имён, PID, сеть, точку монтирования и другие изолированные ресурсы ядра Linux. Контейнер может быть запущен, остановлен, перезапущен, удалён.
Реестр (Registry)
Реестр — хранилище образов. Docker Hub — публичный реестр по умолчанию. Можно использовать частные реестры (например, Harbor, AWS ECR, GitLab Container Registry).
Dockerfile
Файл с инструкциями для сборки образа. Каждая инструкция создаёт новый слой. Поддерживает кэширование слоёв для ускорения повторной сборки.
Volume
Том — механизм постоянного хранения данных вне жизненного цикла контейнера. Поддерживает именованные тома, привязку к директории хоста (bind mount), tmpfs.
Сеть (Network)
Сеть — изолированное пространство для взаимодействия контейнеров. Docker поддерживает несколько драйверов сетей: bridge, host, overlay, macvlan, none.
Docker Compose
Инструмент для определения и запуска многоконтейнерных приложений с помощью файла docker-compose.yml. Упрощает управление зависимостями, сетями, томами и переменными окружения.
Docker Daemon
Фоновый процесс, управляющий контейнерами, образами, сетями и томами. Принимает команды через CLI или REST API.
Docker Client
Клиентская утилита (docker), отправляющая команды демону через Unix-сокет или TCP.
Команды Docker CLI
Управление образами
docker build
Собирает образ из Dockerfile.
Параметры:
-t,--tag: задаёт имя и тег образа (myapp:v1)-f,--file: указывает путь к Dockerfile (по умолчанию./Dockerfile)--build-arg: передаёт аргументы сборки (ARG_NAME=value)--no-cache: отключает использование кэша слоёв--pull: принудительно обновляет базовые образы--target: указывает целевой stage в multi-stage сборке--platform: задаёт целевую архитектуру (linux/amd64,linux/arm64)
Пример:
docker build -t myapp:latest --build-arg ENV=prod .
docker images
Список локальных образов.
Параметры:
-a,--all: показывает промежуточные образы-q,--quiet: выводит только ID--filter: фильтрация по критериям (dangling=true,label=env=prod)--format: формат вывода (Go-шаблон)
docker rmi
Удаляет образ.
Параметры:
-f,--force: принудительное удаление--no-prune: не удалять родительские образы
docker tag
Присваивает дополнительный тег образу.
Пример:
docker tag myapp:latest registry.example.com/myapp:stable
docker push / docker pull
Загрузка и выгрузка образов в/из реестра.
Параметры:
--platform: указывает архитектуру при pull (если манифест поддерживает multi-arch)
Управление контейнерами
docker run
Запускает новый контейнер из образа.
Ключевые параметры:
Идентификация и имя
--name: задаёт имя контейнера-d,--detach: запуск в фоне--rm: автоматическое удаление после завершения
Сеть
--network: указывает сеть (bridge,host, имя пользовательской сети)-p,--publish: проброс портов (host_port:container_port, например8080:80)-P,--publish-all: публикует все EXPOSE-порты на случайные порты хоста--dns: задаёт DNS-серверы--hostname: задаёт hostname внутри контейнера
Хранилище
-v,--volume: монтирует том или директорию (/host/path:/container/path,volume_name:/container/path)--mount: альтернатива-vс более явным синтаксисом (type=bind,source=...,target=...)--tmpfs: монтирует временную файловую систему в RAM
Окружение и переменные
-e,--env: задаёт переменную окружения (KEY=value)--env-file: загружает переменные из файла-u,--user: задаёт пользователя внутри контейнера (uid:gid)
Ресурсы
--cpus: ограничивает количество CPU (например,1.5)--memory,-m: ограничивает объём RAM (512m,2g)--memory-swap: общий лимит RAM + swap--cpu-shares: вес CPU при распределении ресурсов--cpuset-cpus: привязка к конкретным CPU-ядрам (0-3,1,2)
Безопасность
--privileged: даёт контейнеру расширенные привилегии (доступ ко всем устройствам)--cap-add,--cap-drop: добавляет или удаляет Linux capabilities (NET_ADMIN,SYS_TIME)--security-opt: настройки безопасности (seccomp=profile.json,apparmor=unconfined)--read-only: делает корневую ФС контейнера только для чтения--userns: включает user namespace remapping
Вход и интерактивность
-i,--interactive: сохраняет STDIN открытым-t,--tty: выделяет псевдо-TTY--entrypoint: переопределяет точку входа из образа
Жизненный цикл
--restart: политика перезапуска (no,on-failure[:max-retries],always,unless-stopped)--stop-timeout: время ожидания graceful shutdown перед SIGKILL (в секундах)--health-cmd: команда для проверки здоровья--health-interval,--health-timeout,--health-retries: параметры healthcheck
Пример:
docker run -d \
--name webapp \
--restart unless-stopped \
-p 80:80 \
-v app_data:/var/www/html \
-e NODE_ENV=production \
--memory=512m \
nginx:alpine
docker ps
Список запущенных контейнеров.
Параметры:
-a,--all: показывает все (включая остановленные)-q,--quiet: только ID--filter: фильтрация (status=exited,ancestor=nginx,name=web)--format: Go-шаблон вывода
docker stop / docker start / docker restart
Управление состоянием контейнера.
docker stopотправляет SIGTERM, затем SIGKILL через таймаутdocker killотправляет SIGKILL немедленно (или другой сигнал через-s)
docker exec
Выполняет команду внутри работающего контейнера.
Параметры:
-i,-t: интерактивный режим-u: пользователь-w: рабочая директория
Пример:
docker exec -it webapp sh
docker logs
Просмотр логов контейнера.
Параметры:
-f,--follow: потоковый вывод--tail: количество последних строк-t,--timestamps: добавляет временные метки
docker inspect
Подробная информация о контейнере, образе, сети, томе в формате JSON.
Параметры:
-f,--format: извлечение конкретного поля (Go-шаблон)
Пример:
docker inspect -f '{{.NetworkSettings.IPAddress}}' webapp
docker cp
Копирование файлов между хостом и контейнером.
Пример:
docker cp ./config.txt webapp:/app/
docker cp webapp:/app/logs ./logs/
docker update
Динамическое изменение ресурсов работающего контейнера (CPU, memory, restart policy).
Пример:
docker update --memory=1g webapp
Управление томами
docker volume create
Создаёт именованный том.
Параметры:
--driver: драйвер тома (local,nfs,aws-ebs)-o,--opt: опции драйвера (type=nfs,device=...)
Пример:
docker volume create db_data
docker volume ls
Список томов.
docker volume inspect
Детали тома (путь на хосте, драйвер, метки).
docker volume rm
Удаление тома.
Параметры:
-f,--force: принудительное удаление
docker volume prune
Удаляет все неиспользуемые тома.
Управление сетями
docker network create
Создаёт пользовательскую сеть.
Параметры:
--driver: тип сети (bridge,overlay,macvlan)--subnet,--ip-range,--gateway: настройки IP--attachable: разрешает подключение standalone-контейнеров (для overlay)--internal: запрещает исходящий трафик в интернет--opt: опции драйвера
Пример:
docker network create --driver bridge --subnet=172.20.0.0/16 mynet
docker network connect / disconnect
Подключение/отключение контейнера к/от сети.
docker network inspect
Детали сети: подключённые контейнеры, IP-адреса, настройки.
docker network prune
Удаляет неиспользуемые сети.
Dockerfile
Синтаксис и структура
Dockerfile — текстовый файл с набором инструкций для сборки образа. Каждая инструкция создаёт новый слой в образе. Инструкции выполняются последовательно сверху вниз.
Формат:
# Комментарий
ИНСТРУКЦИЯ аргументы
Основные инструкции
FROM
Задаёт базовый образ. Обязательная первая инструкция (кроме комментариев и ARG до FROM).
Синтаксис:
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
Примеры:
FROM alpine:3.18
FROM node:20-alpine AS builder
FROM --platform=linux/arm64 ubuntu:22.04
ARG
Определяет переменную, доступную только во время сборки. Может иметь значение по умолчанию.
Синтаксис:
ARG <name>[=<default value>]
Пример:
ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine
Передача из CLI:
docker build --build-arg NODE_VERSION=18 .
⚠️
ARGне сохраняется в образе после сборки. Для переменных среды выполнения используйтеENV.
ENV
Задаёт переменную окружения, доступную во время сборки и выполнения.
Синтаксис:
ENV <key>=<value>
ENV <key> <value>
Пример:
ENV NODE_ENV=production
ENV PATH="/app/bin:${PATH}"
LABEL
Добавляет метаданные в формате ключ-значение. Используется для описания автора, версии, лицензии и т.д.
Пример:
LABEL maintainer="dev@example.com"
LABEL version="1.0" description="My Web App"
Метки можно просматривать через docker inspect.
WORKDIR
Задаёт рабочую директорию для всех последующих инструкций (RUN, CMD, COPY, ADD, ENTRYPOINT).
Пример:
WORKDIR /app
Если директория не существует — создаётся автоматически.
COPY
Копирует файлы или директории из контекста сборки в образ.
Синтаксис:
COPY [--chown=<user>:<group>] <src>... <dest>
Примеры:
COPY package.json ./
COPY src/ /app/src/
COPY --chown=node:node app.js /app/
Источник должен находиться внутри контекста сборки (обычно текущей директории).
ADD
Аналог COPY, но с дополнительными возможностями:
- распаковка локальных tar-архивов
- загрузка файлов по URL
Рекомендация: использовать COPY, если не нужны эти функции. ADD усложняет понимание и отладку.
RUN
Выполняет команду в новом слое на этапе сборки.
Форматы:
- Shell-формат:
RUN apt-get update && apt-get install -y curl - Exec-формат:
RUN ["executable", "param1", "param2"]
Рекомендации:
- объединять связанные команды в одну строку через
&&для уменьшения числа слоёв - очищать кэш пакетного менеджера в той же строке
Пример:
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
EXPOSE
Объявляет порт, который контейнер будет слушать во время выполнения. Не публикует порт на хосте — это лишь документация.
Пример:
EXPOSE 8080
Публикация происходит через -p при docker run.
VOLUME
Создаёт точку монтирования для тома. Данные в этой директории не сохраняются в образе.
Пример:
VOLUME /data
USER
Задаёт пользователя для выполнения последующих инструкций и запуска контейнера.
Пример:
RUN adduser --disabled-password --gecos '' appuser
USER appuser
Рекомендуется не запускать приложения от root.
CMD
Задаёт команду по умолчанию для запуска контейнера. Может быть переопределена при docker run.
Форматы:
- Shell:
CMD npm start - Exec (предпочтительно):
CMD ["npm", "start"]
Только одна CMD в Dockerfile — последняя имеет эффект.
ENTRYPOINT
Задаёт основную исполняемую команду, которую нельзя переопределить (но можно дополнить через CMD).
Пример:
ENTRYPOINT ["./myapp"]
CMD ["--help"]
При запуске:
docker run myapp # → ./myapp --help
docker run myapp --version # → ./myapp --version
HEALTHCHECK
Определяет команду для проверки работоспособности контейнера.
Синтаксис:
HEALTHCHECK [OPTIONS] CMD command
Опции:
--interval=DURATION(по умолчанию 30s)--timeout=DURATION(по умолчанию 30s)--start-period=DURATION(для медленного старта, по умолчанию 0s)--retries=N(по умолчанию 3)
Пример:
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
STOPSIGNAL
Задаёт сигнал, отправляемый при остановке контейнера (по умолчанию SIGTERM).
Пример:
STOPSIGNAL SIGQUIT
SHELL
Изменяет shell по умолчанию для shell-формата команд.
Пример:
SHELL ["/bin/bash", "-c"]
Multi-stage сборки
Позволяют использовать несколько FROM в одном Dockerfile. Предыдущие стадии могут использоваться как источники для копирования файлов.
Преимущества:
- уменьшение размера финального образа
- разделение этапов сборки и выполнения
Пример (Node.js + production-only):
# Stage 1: сборка
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
# Stage 2: финальный образ
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]
BuildKit
Современный движок сборки, включённый по умолчанию в Docker Desktop и новых версиях Docker Engine.
Возможности:
- параллельная сборка
- кэширование с учётом зависимостей
- секреты без записи в образ (
--mount=type=secret) - экспорт артефактов без создания образа
Включение (если не активирован):
DOCKER_BUILDKIT=1 docker build .
Использование секретов:
# syntax=docker/dockerfile:1
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret
Запуск:
docker build --secret id=mysecret,src=./secret.txt .
Работа с реестрами (Registry)
Авторизация
docker login
docker login registry.example.com
Учётные данные хранятся в ~/.docker/config.json.
Тегирование и публикация
docker tag myapp:latest registry.example.com/myapp:v1.0
docker push registry.example.com/myapp:v1.0
Pull-политики
always: всегда скачиватьmissing: только если отсутствует локальноnever: использовать только локальный
По умолчанию — missing.
Multi-arch образы (манифесты)
Создание образа для нескольких архитектур:
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .
Требует buildx (входит в Docker Desktop).
Безопасность
Лучшие практики
- Использовать минимальные базовые образы (
alpine,distroless) - Не запускать от root
- Удалять ненужные инструменты (curl, wget, git) из финального образа
- Сканировать образы на уязвимости (
docker scan, Trivy, Clair) - Использовать
.dockerignoreдля исключения чувствительных файлов - Хранить секреты вне образа (через
--secret,docker secretsв Swarm, или внешние vaults)
.dockerignore
Аналог .gitignore. Исключает файлы из контекста сборки.
Пример:
.git
node_modules
.env
*.log
Dockerfile*
README.md
Docker Compose — Справочник
Файл docker-compose.yml определяет сервисы, сети, тома.
Базовая структура
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Ключевые поля сервиса
image/build: образ или путь к Dockerfileports: проброс портовvolumes: монтирование томовenvironment: переменные окруженияenv_file: загрузка из файлаdepends_on: порядок запуска (не гарантирует готовность!)restart: политика перезапускаhealthcheck: проверка здоровьяnetworks: подключение к сетямdeploy: параметры для Swarm (ресурсы, реплики)
Команды
docker-compose up: запускdocker-compose down: остановка и удалениеdocker-compose build: пересборкаdocker-compose logs -f: просмотр логов
Конфигурация Docker Daemon
Docker Daemon (dockerd) управляется через файл конфигурации daemon.json, обычно расположенный в /etc/docker/daemon.json (Linux) или настраивается через Docker Desktop (macOS/Windows).
Структура daemon.json
Пример полного файла:
{
"debug": true,
"log-level": "info",
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],
"insecure-registries": ["registry.local:5000"],
"registry-mirrors": ["https://mirror.gcr.io"],
"data-root": "/mnt/docker-data",
"exec-opts": ["native.cgroupdriver=systemd"],
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"features": {
"buildkit": true
},
"experimental": false,
"userns-remap": "default",
"live-restore": true,
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"shutdown-timeout": 30
}
Ключевые параметры
Общие
debug: включает отладочный режимlog-level: уровень логирования (debug,info,warn,error,fatal)experimental: включает экспериментальные функции
Сетевые настройки
hosts: список адресов для прослушивания (Unix-сокет, TCP)insecure-registries: реестры без HTTPS (только для внутренних сетей!)registry-mirrors: зеркала Docker Hub для ускорения загрузки
Хранилище
data-root: директория для хранения образов, контейнеров, томов (по умолчанию/var/lib/docker)storage-driver: драйвер хранилища (overlay2,btrfs,zfs,aufs)
Рекомендуется
overlay2на современных ядрах Linux.
Безопасность
userns-remap: включает user namespace remapping для изоляции UID/GIDicc: межконтейнерная связь (falseзапрещает все соединения без явной сети)iptables: управление правилами iptables (falseотключает автоматическое управление)
Производительность
max-concurrent-downloads: максимум одновременных загрузок слоёв (по умолчанию 3)max-concurrent-uploads: максимум одновременных выгрузок (по умолчанию 5)default-shm-size: размер/dev/shmпо умолчанию (64m)
Жизненный цикл
live-restore: позволяет контейнерам продолжать работу при перезапуске демонаshutdown-timeout: время ожидания graceful shutdown перед завершением демона
После изменения daemon.json требуется перезапуск:
sudo systemctl reload docker
# или
sudo systemctl restart docker
Rootless Mode
Rootless mode позволяет запускать Docker Daemon без прав root, повышая безопасность.
Преимущества
- Изоляция от системных привилегий
- Защита от escape-атак
- Возможность запуска обычным пользователем
Ограничения
- Недоступны порты < 1024 без
authbind - Ограниченная поддержка некоторых драйверов (например,
--privileged) - Требуется поддержка user namespaces в ядре
Установка
curl -fsSL https://get.docker.com/rootless | sh
Переменные окружения:
export PATH=/home/user/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
Конфигурация хранится в ~/.config/docker/.
Docker Contexts
Контекст — это набор настроек для взаимодействия с разными Docker-хостами (локальный, удалённый, Swarm, Kubernetes).
Команды
docker context ls: список контекстовdocker context use <name>: переключениеdocker context create: создание нового контекста
Пример создания удалённого контекста:
docker context create remote \
--docker host=tcp://192.168.1.100:2375
После переключения:
docker context use remote
docker ps # покажет контейнеры на удалённом хосте
Контексты особенно полезны при работе с несколькими средами: dev, staging, prod.
Плагины
Docker поддерживает расширение функциональности через плагины.
Типы плагинов
- Network plugins: Calico, Weave, Flannel
- Volume plugins: Portworx, NetApp, AWS EFS driver
- Authorization plugins: контроль доступа к API
- Logging plugins: отправка логов в ELK, Splunk
Управление
docker plugin install: установкаdocker plugin enable/disable: активация/деактивацияdocker plugin rm: удаление
Пример:
docker plugin install store/vieux/sshfs
docker volume create --driver vieux/sshfs -o sshcmd=user@host:/path vol
Диагностика и устранение неполадок
Частые проблемы и решения
Контейнер сразу завершается
- Причина: основной процесс завершился
- Решение: проверить
CMD/ENTRYPOINT, использоватьdocker logs, запустить в интерактивном режиме
Не хватает места на диске
- Команда:
docker system df - Очистка:
docker system prune -a --volumes
Порт уже занят
- Ошибка:
port is already allocated - Решение: освободить порт или изменить
-pmapping
Доступ к сети заблокирован
- Проверить:
iptables,ufw, SELinux/AppArmor - Временное решение:
--security-opt label=disable
Медленная сборка
- Причины: отсутствие кэша, большой контекст, медленный интернет
- Решение: оптимизировать
.dockerignore, использовать BuildKit, multi-stage
Полезные команды диагностики
docker info # общая информация о системе
docker stats # использование ресурсов в реальном времени
docker top <container> # процессы внутри контейнера
docker events # поток событий (создание, остановка и т.д.)
journalctl -u docker # логи демона (systemd)